package com.syg.springboot07.rabbitmq._02workQueue;


import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 获取MQ的连接
 *
 * work消息队列模型,一个队列,一个生产者,多个消费者,
 *      一个消息只能被一个消费者获取,
 *      消费者从队列中获取消息，服务端如何知道消息已经被消费呢？
 *          答   模式1：自动确认
 *                  只要消息从队列中获取，无论消费者获取到消息后是否成功消息，都认为是消息已经成功消费。
 *               模式2：手动确认
 *                  消费者从队列中获取消息后，服务器会将该消息标记为不可用状态，等待消费者的反馈，如果消费者一直没有反馈，那么该消息将一直处于不可用状态。
 *      消息分发的机制是什么？
 *          答：RabbitMQ 默认将消息顺序发送给下一个消费者，这样，每个消费者会得到相同数量的消息。即轮询（round-robin）分发消息。
 *          这样设计其实是不合理的,因为有的消费者能力强。
 *
 *      测试现象：消费者1消费能力快,消费者2消费能力差,但是处理的任务一样多,为什么会出现处理任务一样多的现象？怎么让能者多劳呢？
 *           答：因为RabbitMQ的默认分发机制。
 *              basicQos 方法设置了当前信道最大预获取（prefetch）消息数量为1。消息从队列异步推送给消费者，消费者的 ack 也是异步发送给队列，从队列的视角去看，
 *              总是会有一批消息已推送但尚未获得 ack 确认，Qos 的 prefetchCount 参数就是用来限制这批未确认消息数量的。设为1时，队列只有在收到消费者发回的上一条消息 ack 确认后，才会向该消费者发送下一条消息。prefetchCount 的默认值为0，即没有限制，队列会将所有消息尽快发给消费者。
 *
 *      如果有一个消费者在消费了,此时在进来一个消费者,那么消息又如何分发?[可以测试一下看现象]
 */
public class ConnectionUtil {

    public static Connection getConnection() throws Exception {
        //定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置服务地址
        factory.setHost("localhost");
        //端口
        factory.setPort(5672);
        //设置账号信息，用户名、密码、vhost
        factory.setVirtualHost("testHost");
        factory.setUsername("admin");
        factory.setPassword("admin");
        // 通过工程获取连接
        Connection connection = factory.newConnection();
        return connection;
    }
}
